/*------------------------------------------------------------------*/
/*																	*/
/*							serpent.c   							*/
/* 																	*/
/* 																	*/
/*------------------------------------------------------------------*/
#include "serpent.h"

    /*-----------------------------------------------*/
    /*                                               */
    /*                 INITIALISATION                */
    /*                                               */
    /*-----------------------------------------------*/
void initSerpent(serpent *pSnake)
{
    initialiserListe(&pSnake->lSerp);
    pSnake->taille = 2;
    pSnake->nombreFruit = 0;

}

void positionInitialeSerpent(serpent *pSnake,int * tab, int M)
{

    int tete = 6;
    int corps = 1;

    int posxtete = DIMX/2;
    int posytete = DIMY/2;

    ajouterEnTeteListe(tete, &pSnake->lSerp);
    ajouterEnQueueListe(corps, &pSnake->lSerp, posxtete,posytete);


    tab[M * DIMX/2 + DIMY/2] =  (*pSnake).lSerp.prem->info;
    tab[M * posxtete + posytete-1] = (*pSnake).lSerp.last->info;

    (*pSnake).lSerp.prem->p.posY = DIMY/2 - 1;
    (*pSnake).lSerp.prem->p.posX = DIMX/2;


}

    /*-----------------------------------------------*/
    /*                                               */
    /*             LIBERATION MEMOIRE                */
    /*                                               */
    /*-----------------------------------------------*/
void libSerpent(serpent *snake)
{

    snake->taille = 0;
    snake->nombreFruit = 0;
    testament(snake->lSerp);
}


    /*-----------------------------------------------*/
    /*                                               */
    /*          FONCTIONS RELATIVES AUX              */
    /*          DEPLACEMENTS DU SERPENT              */
    /*-----------------------------------------------*/


void deplacerDroite(serpent * snake, int * tab, int M, int *agTest, int *deplacement)
{
     /* INITIALISATION D'UNE VARIABLE QUI SERVIRA A TESTER SI LE SERPENT DOIT GRANDIR OU NON */
    int a;
    /* RECUPERATION DE LA POSITION DU SERPENT*/
    int posx = (*snake).lSerp.last->p.posX;
    int posy = (*snake).lSerp.last->p.posY;
    /* RECUPERATION DE LA POSITION DE LA QUEUE*/
    int posyDernier = (*snake).lSerp.prem->p.posY;
    int posxDernier = (*snake).lSerp.prem->p.posX;
    /* RECUPERATION DE LA POSITION DU DEUXIEME ELEMENT DU SERPENT*/
    int posx2 = (*snake).lSerp.last->precedent->p.posX;
    int posy2 = (*snake).lSerp.last->precedent->p.posY;

    /* TEST POUR SAVOIR SI LE SERPENT VIENT DE LA DROITE*/
    if (posy2 == posy + 1)
    {
        posy = posy - 1; /* ON VIENT DE LA DROITE , ON CONTINUE D'ALLER VERS LA GAUCHE, MOUVEMENT VERS LA DROITE IMPOSSIBLE*/
        *deplacement = 1;
    }
    else
    {
        posy = posy + 1; /* LE MOUVEMENT VERS LA DROITE EST AUTORISE*/
        *deplacement = 2;
    }
    /* FIN DU TEST*/

    /* ON AJOUTE UNE NOUVELLE TETE AU SERPENT (LA TETE PRECEDENTE DEVIENT LE SECOND ELEMENT DU SERPENT*/
    
    ajouterEnQueueListe(6, &snake->lSerp, posx, posy);
    

    /* DEFINITION DE LA NOUVELLE VALEUR DE LA TETE ET DE LA QUEUE*/
    (*snake).lSerp.last->precedent->info = 1;
    (*snake).lSerp.prem->info = 0;

    /* MODIFICATION DE LA VALEUR DE LA CASE OCCUPEE PAR LA QUEUE*/
    tab[M * posxDernier + posyDernier] = (*snake).lSerp.prem->info ;
    
    /* MODIFICATION DE LA VALEUR DE LA CASE OCCUPEE PAR LA TETE*/
    tab[M * posx + posy] = (*snake).lSerp.last->info;
    
    
    /* RECUPERATION DE LA POSITION DU DEUXIEME ELEMENT DU SERPENT*/
    posx2 = (*snake).lSerp.last->precedent->p.posX;
    posy2 = (*snake).lSerp.last->precedent->p.posY;
    tab[M * posx + posy2] = (*snake).lSerp.last->precedent->info;
   
    
   

    /* ON RECUPERE LA VALEUR DU COMPTEUR DANS LA VARIABLE*/
    a = *agTest ;

    /*TEST POUR SAVOIR SI LE SERPENT DOIT GRANDIR*/
    /*SI ON A MANGE 3 FRUITS, LE SERPENT GRANDIT (ON NE SUPPRIME PAS LA QUEUE)*/
    if ((a % 4) == 0)
    {
        *agTest = *agTest + 1; /* ON INCREMENT LE COMPTEUR POUR EVITER QUE LE TEST SOIT TOUJOURS JUSTE AU MOUVEMENT SUIVANT*/
        (*snake).taille++;/*incrementation de la taille*/
        tab[M * posxDernier + posyDernier] = 1 ;
    }
    else
    {
        supprimerTeteListe(&snake->lSerp); /* SUPPRESSION DE LA QUEUE DE LA LISTE*/
    }
    /* FIN DU TEST*/
}



    /*-----------------------------------------------*/
    /*        LES FONCTIONS SUIVANTES SONT           */
    /*        CONSTRUITES SUR LE MEME MODELE         */
    /*          QUE LA FONCTION PRECEDENTE           */
    /*-----------------------------------------------*/



void deplacerGauche(serpent * snake, int * tab, int M, int *agTest,  int *deplacement)
{
    int a ;

    int posx = (*snake).lSerp.last->p.posX;
    int posy = (*snake).lSerp.last->p.posY;

    int posyDernier = (*snake).lSerp.prem->p.posY;
    int posxDernier = (*snake).lSerp.prem->p.posX;

    int posx2 = (*snake).lSerp.last->precedent->p.posX;
    int posy2 = (*snake).lSerp.last->precedent->p.posY;

    if (posy2 == posy - 1)
    {
        posy = posy + 1;
        *deplacement = 2;
    }
    else
    {
        posy = posy - 1;
        *deplacement = 1;
    }

    ajouterEnQueueListe(6, &snake->lSerp, posx, posy);

    (*snake).lSerp.last->precedent->info = 1;

    (*snake).lSerp.prem->info = 0;

    tab[M * posxDernier + posyDernier] = (*snake).lSerp.prem->info ;

    tab[M * posx + posy] = (*snake).lSerp.last->info;
    
    posx2 = (*snake).lSerp.last->precedent->p.posX;
    posy2 = (*snake).lSerp.last->precedent->p.posY;
    tab[M * posx + posy2] = (*snake).lSerp.last->precedent->info;

    a = *agTest ;


    if ((a % 4) == 0)
    {
        *agTest = *agTest + 1;
        (*snake).taille++;/*incrementation de la taille*/
        tab[M * posxDernier + posyDernier] = 1 ;
    }
    else
    {
        supprimerTeteListe(&snake->lSerp);
    }
}




void deplacerHaut(serpent * snake, int * tab, int M,  int *agTest,  int *deplacement)
{
    int a;

    int posx = (*snake).lSerp.last->p.posX;
    int posy = (*snake).lSerp.last->p.posY;

    int posyDernier = (*snake).lSerp.prem->p.posY;
    int posxDernier = (*snake).lSerp.prem->p.posX;

    int posx2 = (*snake).lSerp.last->precedent->p.posX;
    int posy2 = (*snake).lSerp.last->precedent->p.posY;


    if (posx2 == posx-1)
    {
        posx = posx + 1;
        *deplacement = 3;
    }
    else
    {
        posx = posx - 1;
        *deplacement = 4;
    }

    ajouterEnQueueListe(6, &snake->lSerp, posx, posy);

    (*snake).lSerp.last->precedent->info = 1;

    (*snake).lSerp.prem->info = 0;

    tab[M * posxDernier + posyDernier] = (*snake).lSerp.prem->info ;

    tab[M * posx + posy] = (*snake).lSerp.last->info;
    
    posx2 = (*snake).lSerp.last->precedent->p.posX;
    posy2 = (*snake).lSerp.last->precedent->p.posY;
    tab[M * posx2 + posy] = (*snake).lSerp.last->precedent->info;

    a = *agTest ;

    if ((a % 4) == 0)
    {
        *agTest = *agTest + 1;
        (*snake).taille++;/*incrementation de la taille*/
        tab[M * posxDernier + posyDernier] = 1 ;
    }
    else
    {
        supprimerTeteListe(&snake->lSerp);
    }
}


void deplacerBas(serpent * snake, int * tab, int M,  int *agTest, int *deplacement)
{
    int a ;

    int posx = (*snake).lSerp.last->p.posX;
    int posy = (*snake).lSerp.last->p.posY;

    int posyDernier = (*snake).lSerp.prem->p.posY;
    int posxDernier = (*snake).lSerp.prem->p.posX;

    int posx2 = (*snake).lSerp.last->precedent->p.posX;
    int posy2 = (*snake).lSerp.last->precedent->p.posY;


    if (posx2 == posx+1)
    {
        posx = posx - 1;
        *deplacement = 4;
    }
    else
    {
        posx = posx + 1;
        *deplacement = 3;
    }

    ajouterEnQueueListe(6, &snake->lSerp, posx, posy);

    (*snake).lSerp.last->precedent->info = 1;

    (*snake).lSerp.prem->info = 0;

    tab[M * posxDernier + posyDernier] = (*snake).lSerp.prem->info ;

    tab[M * posx + posy] = (*snake).lSerp.last->info;
    
    posx2 = (*snake).lSerp.last->precedent->p.posX;
    posy2 = (*snake).lSerp.last->precedent->p.posY;
    tab[M * posx2 + posy] = (*snake).lSerp.last->precedent->info;

    a = *agTest ;

    if ((a % 4) == 0)
    {
        *agTest = *agTest + 1;
        (*snake).taille++;/*incrementation de la taille*/
        tab[M * posxDernier + posyDernier] = 1 ;
    }
    else
    {
        supprimerTeteListe(&snake->lSerp);
    }
}

